package com.test.mywebtest.jhgd.util;

import com.test.mywebtest.jhgd.domain.*;
import org.dom4j.Document;
import org.dom4j.DocumentHelper;
import org.dom4j.Element;
import org.dom4j.io.OutputFormat;
import org.dom4j.io.XMLWriter;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.*;
import java.util.zip.ZipEntry;
import java.util.zip.ZipOutputStream;

public class GDUtil {
    private static final String V1 = "<![CDATA[";
    private static final String V2 = "]]>";


    /**
     * 转换公文数据格式为指定对象，用来准备生成xml文件
     *
     * @param serviceTable 公文类型
     * @param map          公文原始数据
     * @param jjcdList     紧急程度字典项集合
     * @param lwlbList     来文类别字典项集合
     * @return
     */
    public static GDVo convertGDVo1(String serviceTable,
                                    Map<String, Object> map,
                                    List<Map<String, Object>> jjcdList,
                                    List<Map<String, Object>> lwlbList) {
        if ("oa_jh_fawen".equals(serviceTable)) {//发文
            GDFWVo gdfwVo = new GDFWVo();
            gdfwVo.setRemark("发文");
            gdfwVo.setDsid("gwfw");
            gdfwVo.setImporter("OA接口");
            gdfwVo.setId(map.get("object_id") != null ? map.get("object_id").toString() : "");
            gdfwVo.setOrgcode("7000020");

            gdfwVo.setFldtm(map.get("biao_ti").toString() != null ? map.get("biao_ti").toString() : "");
            gdfwVo.setFldxcnd(getYear(map));
            gdfwVo.setFldwjzh(map.get("fa_wen_bian_hao") != null ? map.get("fa_wen_bian_hao").toString() : "");
            gdfwVo.setDeptabbname(map.get("drafter_basic_depart_name") != null ? map.get("drafter_basic_depart_name").toString() : "");
            gdfwVo.setFldwjrq(map.get("wen_jian_ri_qi") != null ? map.get("wen_jian_ri_qi").toString() : "");
            gdfwVo.setFldys(map.get("wen_jian_ye_shu") != null ? map.get("wen_jian_ye_shu").toString() : "");
            gdfwVo.setFldngr(map.get("drafter_name") != null ? map.get("drafter_name").toString() : "");
            gdfwVo.setFldqfr(map.get("qian_fa_ren") != null ? map.get("qian_fa_ren").toString() : "");
            gdfwVo.setFldzrz(map.get("drafter_basic_depart_name") != null ? map.get("drafter_basic_depart_name").toString() : "");
            gdfwVo.setFldjjcd(map.get("jin_ji_cheng_du") != null ? getByCode(jjcdList, map.get("jin_ji_cheng_du").toString()) : "");
            gdfwVo.setFldzs(map.get("zhu_song_ji_guan_ss") != null ? map.get("zhu_song_ji_guan_ss").toString() : "");
            gdfwVo.setFldcs(map.get("chao_song_ji_guan_ss") != null ? map.get("chao_song_ji_guan_ss").toString() : "");
            gdfwVo.setFldbz(map.get("fu_zhu") != null ? map.get("fu_zhu").toString() : "");
            gdfwVo.setFldswfl(map.get("fa_wen_xing_shi") != null ? map.get("fa_wen_xing_shi").toString() : "");

            //初始化参数
            gdfwVo.setFilecount(0);
            gdfwVo.setFilesize(0);
            gdfwVo.setFileext("");

            return gdfwVo;
        } else if ("oa_jh_shouwen".equals(serviceTable)) {//收文
            GDSWVo gdswVo = new GDSWVo();
            gdswVo.setRemark("收文");
            gdswVo.setDsid("gwsw");
            gdswVo.setImporter("OA接口");
            gdswVo.setId(map.get("object_id") != null ? map.get("object_id").toString() : "");
            gdswVo.setOrgcode("7000020");

            gdswVo.setFldtm(map.get("biao_ti").toString() != null ? map.get("biao_ti").toString() : "");
            gdswVo.setFldxcnd(getYear(map));
            gdswVo.setDeptabbname(map.get("drafter_basic_depart_name") != null ? map.get("drafter_basic_depart_name").toString() : "");
            gdswVo.setFldwjzh(map.get("lai_wen_wen_hao") != null ? map.get("lai_wen_wen_hao").toString() : "");
            gdswVo.setFldwjrq(map.get("shou_wen_ri_qi") != null ? map.get("shou_wen_ri_qi").toString() : "");
            gdswVo.setFldzrz(map.get("lai_wen_dan_wei") != null ? map.get("lai_wen_dan_wei").toString() : "");
            gdswVo.setFldjjcd(map.get("jin_ji_cheng_du") != null ? getByCode(jjcdList, map.get("jin_ji_cheng_du").toString()) : "");
            gdswVo.setFldzbh1(map.get("shou_wen_bian_hao") != null ? map.get("shou_wen_bian_hao").toString() : "");
            gdswVo.setFldswfl(map.get("lai_wen_lei_bie") != null ? getByCode(lwlbList, map.get("lai_wen_lei_bie").toString()) : "");
            gdswVo.setFldbz(map.get("fu_zhu").toString() != null ? map.get("fu_zhu").toString() : "");
            gdswVo.setFldys(map.get("wen_jian_ye_shu") != null ? map.get("wen_jian_ye_shu").toString() : "");

            //初始化参数
            gdswVo.setFilecount(0);
            gdswVo.setFilesize(0);
            gdswVo.setFileext("");

            return gdswVo;
        } else if ("oa_jh_qianbao".equals(serviceTable)) {//签报
            GDQBVo gdqbVo = new GDQBVo();
            gdqbVo.setRemark("签报");
            gdqbVo.setDsid("gwqb");
            gdqbVo.setImporter("OA接口");
            gdqbVo.setId(map.get("object_id") != null ? map.get("object_id").toString() : "");
            gdqbVo.setOrgcode("7000020");

            gdqbVo.setFldtm(map.get("biao_ti") != null ? map.get("biao_ti").toString() : "");
            gdqbVo.setFldbh(map.get("fa_wen_bian_hao") != null ? map.get("fa_wen_bian_hao").toString() : "");
            gdqbVo.setDeptabbname(map.get("drafter_basic_depart_name") != null ? map.get("drafter_basic_depart_name").toString() : "");
            gdqbVo.setFldngrq(map.get("drafter_date") != null ? map.get("drafter_date").toString() : "");
            gdqbVo.setFldngr(map.get("drafter_name") != null ? map.get("drafter_name").toString() : "");
            gdqbVo.setFldjjcd(map.get("jin_ji_cheng_du") != null ? getByCode(jjcdList, map.get("jin_ji_cheng_du").toString()) : "");
            gdqbVo.setFldbs(map.get("bao_song") != null ? map.get("bao_song").toString() : "");

            //初始化参数
            gdqbVo.setFilecount(0);
            gdqbVo.setFilesize(0);
            gdqbVo.setFileext("");

            return gdqbVo;
        } else {
            throw new NullPointerException("未查询到对应的公文类型serviceTable:" + serviceTable);
        }
    }

    public static List<GDFileVo> convertGDFileVo1(List<Map<String, Object>> fileList, GDVo gdVo) {
        if (fileList == null || fileList.size() == 0) {
            return new ArrayList<GDFileVo>();
        }
        ArrayList<GDFileVo> list = new ArrayList<>();

        //附件排序规则：
        //发文：正文——附件——发文稿纸——修改稿（最后一次）——其他（历次修改稿等其它文件）（发文稿纸不在这里处理，这里只处理公文表中存在的类型）
        //收文：收文处理单——正文——附件（收文处理单不在这里处理，这里只处理公文表中存在的类型）

        List<Map<String, Object>> mainBody_orderList = new ArrayList();
        List<Map<String, Object>> attachment_orderList = new ArrayList();

        List<Map<String, Object>> temp_orderList = new ArrayList<>();
        for (Map<String, Object> map : fileList) {
            if ("mainBody".equals(map.get("file_category"))) {
                mainBody_orderList.add(map);
            } else if ("attachment".equals(map.get("file_category"))) {
                attachment_orderList.add(map);
            }
        }

        temp_orderList.addAll(mainBody_orderList);
        temp_orderList.addAll(attachment_orderList);

        int filecount = 0;
        int filesize = 0;
        StringBuilder fileext = new StringBuilder();

        for (Map<String, Object> map : temp_orderList) {
            GDFileVo gdFileVo = new GDFileVo();
            gdFileVo.setFilename(map.get("show_name") != null ? map.get("show_name").toString() : "");
            gdFileVo.setShowname(map.get("real_name") != null ? map.get("real_name").toString() : "");
            gdFileVo.setType(map.get("file_category") != null ? map.get("file_category").toString() : "");
            gdFileVo.setTypename(map.get("file_category") != null ? getTypeName(map.get("file_category").toString()) : "");
            gdFileVo.setFilesize(map.get("file_size") != null ? map.get("file_size").toString() : "");
            gdFileVo.setFileext(map.get("show_name") != null ? map.get("show_name").toString().substring(map.get("show_name").toString().lastIndexOf(".") + 1) : "");
            gdFileVo.setMd5(map.get("md5") != null ? map.get("md5").toString() : "");
            gdFileVo.setNumbers("");
            gdFileVo.setId(map.get("object_id") != null ? map.get("object_id").toString() : "");

            //处理文件时计算文件总和
            filecount++;
            filesize += gdFileVo.getFilesize() != null ? Integer.valueOf(gdFileVo.getFilesize().equals("") != true ? gdFileVo.getFilesize() : "0") : 0;
            fileext.append(gdFileVo.getFileext() != null ? gdFileVo.getFileext() + "、" : "");

            list.add(gdFileVo);
        }

        gdVo.setFilecount(gdVo.getFilecount() + filecount);
        gdVo.setFilesize(gdVo.getFilesize() + filesize);
        gdVo.setFileext(gdVo.getFileext() + fileext);

        return list;
    }

    public static List<GDFileVo> convertGDFileVo2(List<Map<String, Object>> fileList, GDVo gdVo) {
        if (fileList == null || fileList.size() == 0) {
            return new ArrayList<GDFileVo>();
        }
        ArrayList<GDFileVo> list = new ArrayList<>();


        //附件排序规则：
        //发文：正文——附件——发文稿纸——修改稿（最后一次）——其他（历次修改稿等其它文件）（发文稿纸不在这里处理，这里只处理公文表中存在的类型）
        //收文：收文处理单——正文——附件（收文处理单不在这里处理，这里只处理公文表中存在的类型）

        List<Map<String, Object>> null_orderList = new ArrayList();
        List<Map<String, Object>> seal_orderList = new ArrayList();
        List<Map<String, Object>> attachmentMark_orderList = new ArrayList();
        List<Map<String, Object>> mark_orderList = new ArrayList();

        List<Map<String, Object>> temp_orderList = new ArrayList<>();
        for (Map<String, Object> map : fileList) {
            if (map.get("file_category") == null || "".equals(map.get("file_category"))) {
                null_orderList.add(map);
            } else if ("attachmentMark".equals(map.get("file_category"))) {
                attachmentMark_orderList.add(map);
            } else if ("mark".equals(map.get("file_category"))) {
                mark_orderList.add(map);
                // 排序-时间倒序
                SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
                Collections.sort(mark_orderList, new Comparator<Map<String, Object>>() {
                    @Override
                    public int compare(Map<String, Object> o1, Map<String, Object> o2) {
                        try {
                            Date date1 = sdf.parse(o1.get("create_date").toString());
                            Date date2 = sdf.parse(o2.get("create_date").toString());
                            return date2.compareTo(date1);
                        } catch (ParseException e) {
                            e.printStackTrace();
                        }
                        return 0;
                    }
                });
            } else if ("seal".equals(map.get("file_category"))) {
                seal_orderList.add(map);
            }
        }

        temp_orderList.addAll(mark_orderList);
        temp_orderList.addAll(seal_orderList);
        temp_orderList.addAll(attachmentMark_orderList);
        temp_orderList.addAll(null_orderList);

        int filecount = 0;
        int filesize = 0;
        StringBuilder fileext = new StringBuilder();

        for (Map<String, Object> map : temp_orderList) {
            GDFileVo gdFileVo = new GDFileVo();
            gdFileVo.setFilename(map.get("show_name") != null ? map.get("show_name").toString() : "");
            gdFileVo.setShowname(map.get("real_name") != null ? map.get("real_name").toString() : "");
            gdFileVo.setType(map.get("file_category") != null ? map.get("file_category").toString() : "");
            gdFileVo.setTypename(map.get("file_category") != null ? getTypeName(map.get("file_category").toString()) : "");
            gdFileVo.setFilesize(map.get("file_size") != null ? map.get("file_size").toString() : "");
            gdFileVo.setFileext(map.get("show_name") != null ? map.get("show_name").toString().substring(map.get("show_name").toString().lastIndexOf(".") + 1) : "");
            gdFileVo.setMd5(map.get("md5") != null ? map.get("md5").toString() : "");
            gdFileVo.setNumbers("");
            gdFileVo.setId(map.get("object_id") != null ? map.get("object_id").toString() : "");

            //处理文件时计算文件总和
            filecount++;
            filesize += gdFileVo.getFilesize() != null ? Integer.valueOf(gdFileVo.getFilesize().equals("") != true ? gdFileVo.getFilesize() : "0") : 0;
            fileext.append(gdFileVo.getFileext() != null ? gdFileVo.getFileext() + "、" : "");

            list.add(gdFileVo);
        }

        gdVo.setFilecount(gdVo.getFilecount() + filecount);
        gdVo.setFilesize(gdVo.getFilesize() + filesize);
        gdVo.setFileext(gdVo.getFileext() + fileext);

        return list;
    }

    /**
     * 生成xml文件
     *
     * @param xmlPath    xml文件生成地址
     * @param gdVo       公文文件信息
     * @param fileList1  正文、附件信息
     * @param fileList2  除正文、附件外的文件信息
     * @param fileList3  审批意见中的文件另附页信息
     * @param yjList     审批意见
     * @param bbGDFileVo 通过报表服务生成的稿纸
     * @param spyjGDFileVo 通过报表服务生成的审批意见
     * @return
     */
    public static String createXmlOa(String xmlPath,
                                     GDVo gdVo,
                                     List<GDFileVo> fileList1,
                                     List<GDFileVo> fileList2,
                                     List<GDFileVo> fileList3,
                                     List<GDYJVo> yjList,
                                     GDFileVo bbGDFileVo,
                                     GDFileVo spyjGDFileVo) {
        // 1.设置生成xml的格式
        OutputFormat format = OutputFormat.createPrettyPrint();
        // 2.设置编码格式
        format.setEncoding("UTF-8");

        /** 建立 document 对象 */
        Document document = DocumentHelper.createDocument();
        /** 加入第一个 DATASETS 节点 */
        Element element_DATASETS = document.addElement("DATASETS");
        /** 加入第二个 DATASET 节点 */
        Element element_DATASET = element_DATASETS.addElement("DATASET");
        /** 加入 参数内容 */
        element_DATASET.addAttribute("REMARK", gdVo.getRemark());
        element_DATASET.addAttribute("DSID", gdVo.getDsid());
        element_DATASET.addAttribute("IMPORTER", gdVo.getImporter());

        /** 加入第三个 DATASET 节点 */
        Element element_ROW = element_DATASET.addElement("ROW");

        /** 公文信息 */
        element_DATASET.addElement("ID").setText(V1 + gdVo.getId() + V2);  //业务id 用来判断是否为重复数据
        element_DATASET.addElement("ORGCODE").setText(V1 + gdVo.getOrgcode() + V2); //组织机构编码


        if (gdVo instanceof GDFWVo) {//发文
            GDFWVo gdfwVo = (GDFWVo) gdVo;
            element_DATASET.addElement("fldtm").setText(V1 + gdfwVo.getFldtm() + V2);
            element_DATASET.addElement("fldxcnd").setText(V1 + gdfwVo.getFldxcnd() + V2);
            element_DATASET.addElement("fldwjzh").setText(V1 + gdfwVo.getFldwjzh() + V2);
            element_DATASET.addElement("deptabbname").setText(V1 + gdfwVo.getDeptabbname() + V2);
            element_DATASET.addElement("fldwjrq").setText(V1 + gdfwVo.getFldwjrq() + V2);
            element_DATASET.addElement("fldys").setText(V1 + gdfwVo.getFldys() + V2);
            element_DATASET.addElement("fldngr").setText(V1 + gdfwVo.getFldngr() + V2);
            element_DATASET.addElement("fldqfr").setText(V1 + gdfwVo.getFldqfr() + V2);
            element_DATASET.addElement("fldzrz").setText(V1 + gdfwVo.getFldzrz() + V2);
            element_DATASET.addElement("fldjjcd").setText(V1 + gdfwVo.getFldjjcd() + V2);
            element_DATASET.addElement("fldzs").setText(V1 + gdfwVo.getFldzs() + V2);
            element_DATASET.addElement("fldcs").setText(V1 + gdfwVo.getFldcs() + V2);
            element_DATASET.addElement("fldbz").setText(V1 + gdfwVo.getFldbz() + V2);
            element_DATASET.addElement("fldswfl").setText(V1 + gdfwVo.getFldswfl() + V2);
        } else if (gdVo instanceof GDSWVo) {//收文
            GDSWVo gdswVo = (GDSWVo) gdVo;
            element_DATASET.addElement("fldtm").setText(V1 + gdswVo.getFldtm() + V2);
            element_DATASET.addElement("fldxcnd").setText(V1 + gdswVo.getFldxcnd() + V2);
            element_DATASET.addElement("deptabbname").setText(V1 + gdswVo.getDeptabbname() + V2);
            element_DATASET.addElement("fldwjzh").setText(V1 + gdswVo.getFldwjzh() + V2);
            element_DATASET.addElement("fldwjrq").setText(V1 + gdswVo.getFldwjrq() + V2);
            element_DATASET.addElement("fldzrz").setText(V1 + gdswVo.getFldzrz() + V2);
            element_DATASET.addElement("fldjjcd").setText(V1 + gdswVo.getFldjjcd() + V2);
            element_DATASET.addElement("fldzbh1").setText(V1 + gdswVo.getFldzbh1() + V2);
            element_DATASET.addElement("fldswfl").setText(V1 + gdswVo.getFldswfl() + V2);
            element_DATASET.addElement("fldbz").setText(V1 + gdswVo.getFldbz() + V2);
            element_DATASET.addElement("fldys").setText(V1 + gdswVo.getFldys() + V2);
        } else if (gdVo instanceof GDQBVo) {//签报
            GDQBVo gdqbVo = (GDQBVo) gdVo;
            element_DATASET.addElement("fldtm").setText(V1 + gdqbVo.getFldtm() + V2);
            element_DATASET.addElement("fldbh").setText(V1 + gdqbVo.getFldbh() + V2);
            element_DATASET.addElement("deptabbname").setText(V1 + gdqbVo.getDeptabbname() + V2);
            element_DATASET.addElement("fldngrq").setText(V1 + gdqbVo.getFldngrq() + V2);
            element_DATASET.addElement("fldngr").setText(V1 + gdqbVo.getFldngr() + V2);
            element_DATASET.addElement("fldjjcd").setText(V1 + gdqbVo.getFldjjcd() + V2);
            element_DATASET.addElement("fldbs").setText(V1 + gdqbVo.getFldbs() + V2);
        } else {
            throw new NullPointerException("未获取到dsid对应的公文类型");
        }

        element_DATASET.addElement("filecount").setText(V1 + gdVo.getFilecount() + V2);
        element_DATASET.addElement("filesize").setText(V1 + gdVo.getFilesize() + V2);

        // 分割字符串
        String[] items = gdVo.getFileext().split("、");
        // 使用Set去重
        Set<String> uniqueItems = new LinkedHashSet<>(Arrays.asList(items));
        // 重新组合成字符串
        String ext = String.join("、", uniqueItems);
        if(ext.length()>0){
            ext = ext.substring(0,ext.length()-1);
        }

        element_DATASET.addElement("fileext").setText(V1 + ext + V2);


        /** 附件信息 */
        Element element_EFILES = element_DATASET.addElement("EFILES");

        /**
         * 这里处理排序,element_EFILE的添加顺序为排序顺序
         * 排序规则：
         * 发文：正文——附件——发文稿纸——修改稿（最后一次）——其他（历次修改稿等其它文件
         * 收文：收文处理单——正文——附件
         *
         */
        int i = 1;//排序
        if (gdVo instanceof GDSWVo) {
            /** 稿纸 */
            if (bbGDFileVo != null && bbGDFileVo.getFileext().equals("pdf")) {
                Element element_EFILE = element_EFILES.addElement("EFILE");
                element_EFILE.addElement("SHOWNAME").setText(V1 + bbGDFileVo.getShowname() + V2);
                element_EFILE.addElement("FILENAME").setText(V1 + bbGDFileVo.getFilename() + V2);
                element_EFILE.addElement("TYPE").setText(V1 + bbGDFileVo.getType() + V2);
                element_EFILE.addElement("TYPENAME").setText(V1 + bbGDFileVo.getTypename() + V2);
                element_EFILE.addElement("FILESIZE").setText(V1 + bbGDFileVo.getFilesize() + V2);
                element_EFILE.addElement("FILEEXT").setText(V1 + bbGDFileVo.getFileext() + V2);
                element_EFILE.addElement("MD5").setText(V1 + bbGDFileVo.getMd5() + V2);
                element_EFILE.addElement("NUMBER").setText(V1 + i++ + V2);//排序
            }
        }

        //正文、附件
        if (fileList1 != null && fileList1.size() > 0) {
            for (GDFileVo file : fileList1) {
                Element element_EFILE = element_EFILES.addElement("EFILE");
                element_EFILE.addElement("SHOWNAME").setText(V1 + file.getShowname() + V2);
                element_EFILE.addElement("FILENAME").setText(V1 + file.getFilename() + V2);
                element_EFILE.addElement("TYPE").setText(V1 + file.getType() + V2);
                element_EFILE.addElement("TYPENAME").setText(V1 + file.getTypename() + V2);
                element_EFILE.addElement("FILESIZE").setText(V1 + file.getFilesize() + V2);
                element_EFILE.addElement("FILEEXT").setText(V1 + file.getFileext() + V2);
                element_EFILE.addElement("MD5").setText(V1 + file.getMd5() + V2);
                element_EFILE.addElement("NUMBER").setText(V1 + i++ + V2);//排序
            }
        }
        if (gdVo instanceof GDFWVo || gdVo instanceof GDQBVo) {
            /** 稿纸 */
            if (bbGDFileVo != null && bbGDFileVo.getFileext().equals("pdf")) {
                Element element_EFILE = element_EFILES.addElement("EFILE");
                element_EFILE.addElement("SHOWNAME").setText(V1 + bbGDFileVo.getShowname() + V2);
                element_EFILE.addElement("FILENAME").setText(V1 + bbGDFileVo.getFilename() + V2);
                element_EFILE.addElement("TYPE").setText(V1 + bbGDFileVo.getType() + V2);
                element_EFILE.addElement("TYPENAME").setText(V1 + bbGDFileVo.getTypename() + V2);
                element_EFILE.addElement("FILESIZE").setText(V1 + bbGDFileVo.getFilesize() + V2);
                element_EFILE.addElement("FILEEXT").setText(V1 + bbGDFileVo.getFileext() + V2);
                element_EFILE.addElement("MD5").setText(V1 + bbGDFileVo.getMd5() + V2);
                element_EFILE.addElement("NUMBER").setText(V1 + i++ + V2);//排序
            }
        }
        //除正文、附件外文件
        if (fileList2 != null && fileList2.size() > 0) {
            for (GDFileVo file : fileList2) {
                Element element_EFILE = element_EFILES.addElement("EFILE");
                element_EFILE.addElement("SHOWNAME").setText(V1 + file.getShowname() + V2);
                element_EFILE.addElement("FILENAME").setText(V1 + file.getFilename() + V2);
                element_EFILE.addElement("TYPE").setText(V1 + file.getType() + V2);
                element_EFILE.addElement("TYPENAME").setText(V1 + file.getTypename() + V2);
                element_EFILE.addElement("FILESIZE").setText(V1 + file.getFilesize() + V2);
                element_EFILE.addElement("FILEEXT").setText(V1 + file.getFileext() + V2);
                element_EFILE.addElement("MD5").setText(V1 + file.getMd5() + V2);
                element_EFILE.addElement("NUMBER").setText(V1 + i++ + V2);//排序
            }
        }
        //意见另附页文件
        if (fileList3 != null && fileList3.size() > 0) {
            for (GDFileVo file : fileList3) {
                Element element_EFILE = element_EFILES.addElement("EFILE");
                element_EFILE.addElement("SHOWNAME").setText(V1 + file.getShowname() + V2);
                element_EFILE.addElement("FILENAME").setText(V1 + file.getFilename() + V2);
                element_EFILE.addElement("TYPE").setText(V1 + file.getType() + V2);
                element_EFILE.addElement("TYPENAME").setText(V1 + file.getTypename() + V2);
                element_EFILE.addElement("FILESIZE").setText(V1 + file.getFilesize() + V2);
                element_EFILE.addElement("FILEEXT").setText(V1 + file.getFileext() + V2);
                element_EFILE.addElement("MD5").setText(V1 + file.getMd5() + V2);
                element_EFILE.addElement("NUMBER").setText(V1 + i++ + V2);//排序
            }
        }

        /** 审批意见pdf文件 */
        if (spyjGDFileVo != null && spyjGDFileVo.getFileext().equals("pdf")) {
            Element element_EFILE = element_EFILES.addElement("EFILE");
            element_EFILE.addElement("SHOWNAME").setText(V1 + spyjGDFileVo.getShowname() + V2);
            element_EFILE.addElement("FILENAME").setText(V1 + spyjGDFileVo.getFilename() + V2);
            element_EFILE.addElement("TYPE").setText(V1 + spyjGDFileVo.getType() + V2);
            element_EFILE.addElement("TYPENAME").setText(V1 + spyjGDFileVo.getTypename() + V2);
            element_EFILE.addElement("FILESIZE").setText(V1 + spyjGDFileVo.getFilesize() + V2);
            element_EFILE.addElement("FILEEXT").setText(V1 + spyjGDFileVo.getFileext() + V2);
            element_EFILE.addElement("MD5").setText(V1 + spyjGDFileVo.getMd5() + V2);
            element_EFILE.addElement("NUMBER").setText(V1 + i++ + V2);//排序
        }



        /** 审批意见 */
        Element element_BASIC_BEHAVIOURS = element_DATASET.addElement("BASIC_BEHAVIOURS");
        if (yjList != null && yjList.size() > 0) {
            for (GDYJVo gdyjVo : yjList) {
                Element element_BASIC_BEHAVIOUR = element_BASIC_BEHAVIOURS.addElement("BASIC_BEHAVIOUR");
                element_BASIC_BEHAVIOUR.addElement("YWXW").setText(V1 + gdyjVo.getYwxw() + V2);
                element_BASIC_BEHAVIOUR.addElement("YWSJ").setText(V1 + gdyjVo.getYwsj() + V2);
                element_BASIC_BEHAVIOUR.addElement("YWRY").setText(V1 + gdyjVo.getYwry() + V2);
                element_BASIC_BEHAVIOUR.addElement("YWBM").setText(V1 + gdyjVo.getYwbm() + V2);
                element_BASIC_BEHAVIOUR.addElement("YWZT").setText(V1 + gdyjVo.getYwzt() + V2);
                element_BASIC_BEHAVIOUR.addElement("YWMS").setText(V1 + gdyjVo.getYwms() + V2);
            }
        }


        try {
            FileOutputStream fileOutputStream = new FileOutputStream(xmlPath);
            XMLWriter writer = new XMLWriter(fileOutputStream, format);

            // 设置是否转义，默认使用转义字符
            writer.setEscapeText(false);
            writer.write(document);
            writer.close();
            fileOutputStream.close();
        } catch (Exception e) {
            e.printStackTrace();
            return "异常" + e.getMessage();
        }
        return "成功";

    }


    /**
     * 创建xml文件
     *
     * @param fileUrl 文件路径
     */
    public static void createXml(String fileUrl) {

        /**
         * <?xml version="1.0" encoding="UTF-8"?>
         *
         * <books>
         *   <!--This is a test for dom4j, holen, 2004.9.11-->
         *   <book show="yes">
         *     <title>Dom4j Tutorials</title>
         *   </book>
         *   <book show="yes">
         *     <title>Lucene Studing</title>
         *   </book>
         *   <book show="no">
         *     <title>Lucene in Action</title>
         *   </book>
         *   <owner>O'Reilly</owner>
         * </books>
         *
         */

        // 1.设置生成xml的格式
        OutputFormat format = OutputFormat.createPrettyPrint();
        // 2.设置编码格式
        format.setEncoding("UTF-8");

        /** 建立 document 对象 */
        Document document = DocumentHelper.createDocument();
        /** 建立 XML 文档的根 books */
        Element booksElement = document.addElement("books");
        /** 加入一行注释 */
        booksElement.addComment("This is a test for dom4j, holen, 2004.9.11");
        /** 加入第一个 book 节点 */
        Element bookElement = booksElement.addElement("book");
        /** 加入 show 参数内容 */
        bookElement.addAttribute("show", "yes");
        /** 加入 title 节点 */
        Element titleElement = bookElement.addElement("title");
        /** 为 title 设置内容 */
        titleElement.setText("Dom4j Tutorials");

        /** 类似的完成后两个 book */
        bookElement = booksElement.addElement("book");
        bookElement.addAttribute("show", "yes");
        titleElement = bookElement.addElement("title");
        titleElement.setText("Lucene Studing");
        bookElement = booksElement.addElement("book");
        bookElement.addAttribute("show", "no");
        titleElement = bookElement.addElement("title");
        titleElement.setText("Lucene in Action");

        /** 加入 owner 节点 */
        Element ownerElement = booksElement.addElement("owner");
        ownerElement.setText("O'Reilly");


        try {
            FileOutputStream fileOutputStream = new FileOutputStream(fileUrl);
            XMLWriter writer = new XMLWriter(fileOutputStream, format);

            // 设置是否转义，默认使用转义字符
            writer.setEscapeText(false);
            writer.write(document);
            writer.close();
            fileOutputStream.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }


    /**
     * 遍历待压缩的文件夹，并将文件夹中的文件逐个添加到压缩文件中
     *
     * @param folder
     * @param parentFolder
     * @param zipOut
     * @throws IOException
     */
    public static void addFolderToZip(File folder, String parentFolder, ZipOutputStream zipOut) throws IOException {
        if (folder.isDirectory()) {
            // 获取文件夹中的所有子文件和子文件夹
            for (File file : folder.listFiles()) {
                // 递归调用，处理子文件夹
                addFolderToZip(file, parentFolder + folder.getName() + "/", zipOut);
            }
        } else {
            // 添加单个文件到压缩文件中
            byte[] buffer = new byte[1024];
            try (FileInputStream fis = new FileInputStream(folder)) {
                zipOut.putNextEntry(new ZipEntry(parentFolder + folder.getName()));
                int length;
                while ((length = fis.read(buffer)) > 0) {
                    zipOut.write(buffer, 0, length);
                }
            }
        }
    }

    /**
     * 通过code获取字典值
     *
     * @param list
     * @param code
     * @return
     */
    public static String getByCode(List<Map<String, Object>> list, String code) {
        for (Map<String, Object> m : list) {
            if (code.equals(m.get("businessCode"))) {
                return m.get("businessValue").toString();
            }
        }
        return code;
    }

    /**
     * 设置xml文件标签中的type
     *
     * @param code
     * @return
     */
    public static String getTypeName(String code) {
        switch (code) {
            case "mainBody":
                return "正文";
            case "attachment":
                return "附件";
            case "mark":
                return "痕迹稿";
            case "seal":
                return "盖章文件";
            case "attachmentMark":
                return "附件痕迹稿";
            case "gz":
                return "稿纸";
            case "yjlfy":
                return "意见另附页";
            case "spyj":
                return "审批意见";
            default:
                return code;
        }
    }


    /**
     * 获取规则
     * nian_fen字段为空的话从文件日期wen_jian_ri_qi字段截取年份
     *
     * @param map
     * @return
     */
    public static String getYear(Map<String, Object> map) {
        if (map.get("nian_fen") != null && !"".equals(map.get("nian_fen"))) {
            return map.get("nian_fen").toString();
        } else {
            if (map.get("wen_jian_ri_qi") != null && !"".equals("wen_jian_ri_qi")) {
                String rq = map.get("wen_jian_ri_qi").toString();
                int i = extractYear(rq);
                return String.valueOf(i);
            }
        }
        return "";
    }

    /**
     * 从字符串格式的时间中提取年份
     *
     * @param dateTimeStr 字符串格式的时间
     * @return 年份
     */
    public static int extractYear(String dateTimeStr) {
        // 定义日期时间格式
        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");

        // 解析字符串为 LocalDateTime 对象
        LocalDateTime dateTime = LocalDateTime.parse(dateTimeStr, formatter);

        // 获取年份
        int year = dateTime.getYear();

        return year;
    }


    /**
     * 转换公文意见数据格式为指定对象，用来准备生成xml文件
     *
     * @param opinionList
     * @return
     */
    public static List<GDYJVo> convertGDVo2(List<Map<String, Object>> opinionList) {
        if (opinionList == null || opinionList.size() == 0) {
            return new ArrayList<GDYJVo>();
        }

        List<GDYJVo> gdyjVoList = new ArrayList<>();
        for (Map<String, Object> map : opinionList) {
            GDYJVo gdyjVo = new GDYJVo();
            gdyjVo.setYwxw(map.get("displayName") != null ? map.get("displayName").toString() : "");
            gdyjVo.setYwsj(map.get("approvalDate") != null ? map.get("approvalDate").toString() : "");
            gdyjVo.setYwry(map.get("approvalUserName") != null ? map.get("approvalUserName").toString() : "");
            gdyjVo.setYwbm(map.get("approvalDepartment") != null ? map.get("approvalDepartment").toString() : "");
            gdyjVo.setYwzt("完成");   //oa公文系统中没有此项
            gdyjVo.setYwms(map.get("approvalOpinionInput") != null ? map.get("approvalOpinionInput").toString() : "");

            gdyjVoList.add(gdyjVo);
        }

        return gdyjVoList;
    }
}
